package main

import (
	"fmt"
	"time"
)

/*
*
func (t *Timer) Reset(d Duration) bool
Reset 使t 重新开始计时，（本方法返回后再）等待时间段d 过去后到期，如果时间调用时 t 还在等待中会返回true;
如果t已经到期获取停止了会返回false。
例如，你已经开启了一个计时器在运行，然后你在它上调用Reset方法，那么从你调用Reset 这一刻开始，计时器就重新开始计时，并且在Reset 指定是将段d之后到期。
当你 Reset 一个计时器时，计时器可能有两种情况：一是计时器还在运行，二是计时器已经到期。那么在第一种情况下，
Reset 令计时器重新开始计时并返回 true；如果计时器已经到期，Reset 令计时器重新开始计时并返回 false。
所以，Reset的返回值不代表重启定时器成功或失败，而是在表达定时器在重设前的状态：

当Timer已经停止或者超时，返回false。
当定时器未超时时，返回true。
比如你的定时器设置的是3秒，中间sleep 1秒 < 3，这时候如果 reset 的话返回的就是 true(因为定时器还在等待)，如果你sleep 4秒 > 3,那么返回的就是 false。
*/

func main() {
	start := time.Now()
	fmt.Println("startTime:------", start)
	timer := time.AfterFunc(2*time.Second, func() {
		fmt.Println("after func callback, elaspe:", time.Now())
	})

	time.Sleep(1 * time.Second)
	// time.Sleep(3*time.Second)
	// Reset 在 Timer 还未触发时返回 true；触发了或 Stop 了，返回 false
	if timer.Reset(4 * time.Second) {
		fmt.Println("timer has not trigger!-----", time.Now())
	} else {
		fmt.Println("timer had expired or stop!----", time.Now())
	}

	// 保证上面的计时器时间到了能继续执行，不然会直接跳出这个函数，无法执行timer.after
	time.Sleep(10 * time.Second)
	fmt.Printf("end:-------", time.Now())
}
